﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Specialized;
using System.Xml;
using Darren.Common.Helper;

namespace OAuth
{
    public class QQOAuth : OAuthBase
    {
        private string GenErrorMessage(string error_code)
        {
            switch (error_code.Trim())
            {
                //10001-13000：请求临时token时，发生错误
                case "10001":
                    return "oauth_consumer_key（即appid）非法。请根据请求临时token的请求参数说明检查参数名及参数值是否正确。 ";
                case "10002":
                    return "oauth_signature_method非法。请根据请求临时token的请求参数说明检查参数名及参数值是否正确。";
                case "10003":
                    return "oauth_version非法。请根据请求临时token的请求参数说明检查参数名及参数值是否正确。";
                case "10004":
                    return "oauth_nonce非法。请根据请求临时token的请求参数说明检查参数名及参数值是否正确。 ";
                case "10005":
                    return "oauth_timestamp非法 。请根据请求临时token的请求参数说明检查参数名及参数值是否正确。该错误一般是由于服务器时间不同步引起的。注意第三方服务器时间与腾讯服务器时间相差不能超过5分钟。 ";
                case "10006":
                    return "oauth_consumer_key（即appid）未注册 ";
                case "11000":
                    return "oauth_signature（签名值）错误，请注意检查参数名及参数值是否正确。请按照【QQ登录】签名参数oauth_signature的说明详细检查签名值的生成。 ";
                case "11001":
                    return "APP被禁用。被禁用可能是由于违反了【QQ登录】接入规范造成的。请通过企业QQ联系的QQ登录支持人员，获得最终解释。 ";
                case "12000":
                    return "系统内部错误。请通过企业QQ联系的QQ登录支持人员，调查问题原因并获得解决方案。 ";
                //20001-23000：请求对临时token授权时，发生错误
                case "20001":
                    return "oauth_consumer_key（即appid）非法。请根据请求已授权的临时token的请求参数说明检查参数名及参数值是否正确。 ";
                case "20002":
                    return "oauth_token（未授权的临时token）非法。请根据请求已授权的临时token的请求参数说明检查参数名及参数值是否正确。 ";
                case "20003":
                    return "oauth_callback非法，请注意检查是否与申请时提交的回调地址一致 ";
                case "20004":
                    return "oauth_consumer_key（即appid）未注册 ";
                case "21000":
                    return "用户未登录";
                case "21001":
                    return "用户未开通QQ空间";
                case "21002":
                    return "获取用户授权信息失败";
                case "21003":
                    return "获取APP信息失败";
                case "21004":
                    return "非法的HTTP请求";
                case "21005":
                    return "APP被禁用。被禁用可能是由于违反了【QQ登录】接入规范造成的。请通过企业QQ联系的QQ登录支持人员，获得最终解释。";
                case "22000":
                    return "系统内部错误。请通过企业QQ联系的QQ登录支持人员，调查问题原因并获得解决方案";
                //30001-33000：请求具有Qzone访问权限的access_token时，发生错误
                case "30001":
                    return "oauth_consumer_key（即appid）非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。 ";
                case "30002":
                    return "oauth_signature_method非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。 ";
                case "30003":
                    return "oauth_version非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。";
                case "30004":
                    return "oauth_nonce非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。";
                case "30005":
                    return "oauth_timestamp非法 ，请注意检查参数名及参数值是否正确。该错误一般是由于服务器时间不同步引起的。注意第三方服务器时间与腾讯服务器时间相差不能超过5分钟。 ";
                case "30006":
                    return "oauth_token（已授权的临时token）非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。 ";
                case "30007":
                    return "oauth_vericode非法。请根据请求access_token的请求参数说明检查参数名及参数值是否正确。";
                case "30008":
                    return "oauth_consumer_key（即appid）未注册";
                case "31000":
                    return "oauth_signature（签名值）错误，请注意检查参数名及参数值是否正确。请按照【QQ登录】签名参数oauth_signature的说明详细检查签名值的生成。 ";
                case "31001":
                    return "oauth_token未被授权";
                case "31002":
                    return "APP被禁用。被禁用可能是由于违反了【QQ登录】接入规范造成的。请通过企业QQ联系的QQ登录支持人员，获得最终解释。 ";
                case "32000":
                    return "系统内部错误。请通过企业QQ联系的QQ登录支持人员，调查问题原因并获得解决方案。 ";
                //1000-1002，40001-43000：调用OpenAPI访问/修改Qzone资源时，发生错误
                default:
                    return "未知错误";
            }
            
        }
        public static string AppKey
        {
            get { return ConfigHelper.GetConfigString("QQ_AppKey"); }
        }
        public static string AppSecret
        {
            get { return ConfigHelper.GetConfigString("QQ_AppSecret"); }
        }
        public static string CallBackURL
        {
            get { return ConfigHelper.GetConfigString("QQ_CallBackURL"); }
        }
        
        //获取未未授权token url:网站向Qzone发送request，请求临时token
        private const string qzoneoauth_request_token_url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token";
        //登录url:网站引导用户到QQ登录窗口地址
        private const string qzoneoauth_authorize_url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize";
        //获取access token url:网站请求具有Qzone访问权限的access_token
        private const string qzoneoauth_access_token_url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token";
        //获取user info url
        private const string get_user_info_url = "http://openapi.qzone.qq.com/user/get_user_info";
        //获取登录用户收听的人的列表
        private const string get_idollist_url = "http://openapi.qzone.qq.com/relation/get_fanslist";
        //验证登录的用户是否为某个认证空间的粉丝
        private const string check_fans = "http://openapi.qzone.qq.com/user/check_page_fans";
        //获取腾讯微博其他用户详细信息
        private const string get_other_info_url = "http://openapi.qzone.qq.com/user/get_other_info";
        private string oauth_callback;
        public string Oauth_callback { get { return oauth_callback; } set { oauth_callback = value; } }

        public QQOAuth()
        {
            this.app_id = QQOAuth.AppKey;
            this.app_key = QQOAuth.AppSecret;
        }
        public QQOAuth(string _appid, string _appkey):base(_appid,_appkey)
        {
            
        }
        /// <summary>
        /// 第一步登录
        /// </summary>
        /// <param name="oauth_token_secret">未授权的token</param>
        /// <returns>网站引导用户到QQ登录窗口地址</returns>
        public string Login(out AccessToken token, string callbackUrl)
        {
            if (string.IsNullOrEmpty(callbackUrl))
                throw new ArgumentNullException("请提供Oauth_callback属性");

            
            string result = GenResponse(qzoneoauth_request_token_url);

            NameValueCollection nvc = HttpUtility.ParseQueryString(result);
            if (nvc["error_code"] != null)
            {
                throw new Exception(nvc["error_code"]+":"+GenErrorMessage(nvc["error_code"]));
            }
            
            token = new AccessToken();
            token.Token = nvc["oauth_token"];
            token.TokenSecret = nvc["oauth_token_secret"];
            return string.Format("{0}?oauth_consumer_key={3}&oauth_token={1}&oauth_callback={2}", qzoneoauth_authorize_url, token.Token, callbackUrl, this.app_id);
        }

        public MemberInfo GetUserInfo()
        {
            checkToken();
            string url = string.Format("{0}?format={1}&openid={2}", get_user_info_url, "xml", this.Token.Openid);
            string result = GenResponse(url);
            
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(result);
            string ret = doc.SelectSingleNode("/data/ret").InnerXml;
            if (ret != "0")
                throw new Exception(ret+":"+doc.SelectSingleNode("/data/msg").InnerXml);
            string displayName = doc.SelectSingleNode("/data/nickname").InnerXml;
            string smallFace = doc.SelectSingleNode("/data/figureurl").InnerXml;
            string middleFace = doc.SelectSingleNode("/data/figureurl_1").InnerXml;
            string bigFace = doc.SelectSingleNode("/data/figureurl_2").InnerXml;

            return new MemberInfo(displayName,"95283",middleFace);
        }

        public string GetFriendsList()
        {
            checkToken();
            string url = string.Format("{0}?format={1}&reqnum={2}&startindex={3}&openid={4}", get_idollist_url, "xml", 2, 0,this.Token.Openid);
            //string url = string.Format("https://graph.qq.com/relation/get_fanslist?access_token={0}&oauth_consumer_key={1}&openid={2}&format=xml&reqnum=30&startindex=0",this.Token.Token,this.app_id,this.Token.Openid);

            string result = GenResponse(url);

            return result;
        }


        /// <summary>
        /// 获取授权参数，如openid
        /// </summary>
        /// <param name="oauth_token">未授权的token</param>
        /// <returns></returns>
        public AccessToken GetAccessToken(string oauth_vericode)
        {
            checkToken();
            string url = string.Format("{0}?oauth_vericode={1}", qzoneoauth_access_token_url, oauth_vericode);
            string result = GenResponse(url);

            NameValueCollection nvc = HttpUtility.ParseQueryString(result);
            if (nvc["error_code"] != null)
            {
                throw new Exception(nvc["error_code"] + ":" + GenErrorMessage(nvc["error_code"]));
            }
            return new AccessToken(nvc["oauth_token"], nvc["oauth_token_secret"], nvc["openid"]);
        }

        public string CheckFans(long qq)
        {
            checkToken();
            string url = string.Format("{0}?format={1}&page_id={2}&openid={3}", check_fans, "xml", qq,this.Token.Openid);

            string result = GenResponse(url);

            return result;
        }
        public string GetOtherInfo(string name)
        {
            checkToken();
            string url = string.Format("{0}?format={1}&name={2}&openid={3}", get_other_info_url, "xml", name, this.Token.Openid);

            string result = GenResponse(url);

            return result;
        }

    }
}